package com.example.javabasic.suanfa.剑指offer.旋转数组最小数字;

/**
 * @description 旋转数组中最小数
 * @Author Lin FuYuan
 * @date 2021/7/6
 *
 * 把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。
 * 输入一个非递减排序的数组的一个旋转，输出旋转数组的最小元素。
 * NOTE：给出的所有元素都大于0，若数组大小为0，请返回0。
 *
 * 示例1
 * 输入：
 * [3,4,5,1,2]
 * 返回值：
 * 1
 */
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array == null){
            return 0;
        }
        if ((array.length == 1)){
            return array[0];
        }
        //左端下标
        int low  = 0 ;
        //右端下标
        int high = array.length-1;
        while(low<high){
            //如果 左边数小于右边数, 则返回小的值
            if(array[low]<array[high]){
                return array[low];
            }
            //中间值下标计算
            int mid = low+(high-low)/2;
            //中间值小于后边的值,则 后边的值下标移到 中间
            if(array[mid]<array[high]){
                high = mid;
            }else if(array[mid]> array[high]){
                //中间值大于 后边的值,那么 前面的值下标移到 中间值+1处
                low = mid+1;
            }else{
                //否则 high --
                high--;
            }
        }
        return array[low];
    }

}
